<?php

namespace app\admin\controller;

use app\home\model\User;
use think\Controller;
use think\Request;
use app\admin\model\Goods as GoodsModel;    //需要重命名【和控制器重名】

class Goods extends Base
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index()
    {
        //接收keyword参数
        $keyword = input('keyword');
        $where = [];
        if(!empty($keyword)) {
            $where['goods_name'] = ['like',"%$keyword%"];   //like【模糊查询】
        }

        //查询列表页需要的数据
        $list = GoodsModel::select();
       // $this->assign('list', $list);
        //商品列表	 Goods控制器index方法  goods_list.html  ->  index.html
        //渲染模板
       // $list = (new \think\Collection($list))->toArray();
       // dump($list);
        $list = GoodsModel::where($where)->order('id desc')->paginate(6, false, ['query'=>['keyword'=>$keyword]]);
        return $this->fetch('index', ['list' => $list]);
    }

    /**
     * 显示创建资源表单页.
     *
     * @return \think\Response
     */
    public function create()
    {
        //商品新增 	Goods控制器create方法  goods_add.html  -> create.html
        return view();
    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        //where方法使用
//        $goods = \app\admin\model\Goods::where('id', '=', 33)->find();
//        $goods = \app\admin\model\Goods::where('id', 33)->find();   //等号可以省略
//        $goods = \app\admin\model\Goods::where('goods_price', '>', 100)->find();   //搜索单价大于一百的数据
//        dump($goods->toArray());
        //接收参数
        $params = input();
//        $param = $request->param();
//        $param = $this->request->param();
//        $param = request()->param();
//         dump($param);
        //参数检测  略  （） （表单验证）
        //1.独立验证
        //定义验证规则
        /*$rule = [
            'goods_name|商品名称' => 'require',
            'goods_price|商品价格' => 'require|float|egt:0',
            'goods_number|商品数量' => 'require|integer|egt:0',
        ];
        //定义错误提示信息（可选）
        $msg = [
            'goods_price.float' => '商品的价格必须是整数或者小数',
        ];
        //实例化验证类Validate
        $validate = new \think\Validate($rule, $msg);
        //执行验证
        if(!$validate->check($param))
        {
            //验证失败
            $error_msg = $validate->getError();
            $this->error($error_msg);
        }*/
        //2.控制器验证（传递数据较多时使用控制器验证）
        //定义验证规则
        $rule = [
            'goods_name|商品名称' => 'require',
            'goods_price|商品价格' => 'require|float|egt:0',
            'goods_number|商品数量' => 'require|integer|egt:0',
        ];
        //定义错误提示信息（可选）
        $msg = [
            'goods_price.float' => '商品的价格必须是整数或者小数',
        ];
        //调用控制器的validate方法
        $validate = $this->validate($params, $rule, $msg);
        if($validate !== true)  //恒等于
        {
            //验证失败
            $this->error($validate);
        }

        //商品logo图片上传
        $params['goods_logo'] = $this->upload_logo();

        //添加数据到数据表  第二个参数true表示过滤非数据表字段
        $res = \app\admin\model\Goods::create($params, true);

        //页面跳转
        //成功跳转
        // $this->success('操作成功', 'admin/goods/index');
        //失败跳转
        // $this->error('操作失败', 'admin/goods/create');
        //重定向跳转
        // $this->redirect('admin/goods/create');  //没有提示，直接跳转
        if($res) {
            $this->success('操作成功', 'admin/goods/index');
        } else {
            $this->error('操作失败', 'admin/goods/create');
        }
    }

    /**
     * @return 图片路径
     */
    //商品logo图片上传
    private function upload_logo()
    {
        //获取到上传的文件 对象
        $file = request()->file('logo');
        if(empty($file)) {
            $this->error("没有上传logo图片");
            // unset($params['goods_logo']);
        }  /*else {
            $param['goods_logo'] = $this->upload_logo();
            //先查询原图片地址
            $goods = GoodsModel::find($id);
        }*/
        //移动文件到指定的目录下 public/uploads目录
        $info = $file->validate(['size'=>10 * 1024 * 1024, 'ext' => 'jpg,png,gif,jpeg'])->move(ROOT_PATH . 'public' . DS . 'uploads');
        //判断结果处理
        if($info) {
            //上传成功，拼接图片的访问路径
            $goods_logo = DS . 'uploads' . DS . $info->getSaveName();
            //生成缩略图 \think\Image类 保存
            //打开图片
            $image = \think\Image::open('.' .$goods_logo);
            //生成缩略图 保存图片
            $image->thumb(300, 250)->save('.' .$goods_logo);
            //返回图片路径
            return $goods_logo;
        } else {
            //上传失败 调试$file的getError方法，获取到具体的错误信息
            $error = $file->getError();
            $this->error($error);
        }
    }

    /**
     * 显示指定的资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function read($id)   //形参从URL中读取
    {
        //商品详情 	Goods控制器read方法  goods_detail.html  -> read.html
        //查询一条数据
        $goods = \app\admin\model\Goods::find($id);
        return view('read', ['goods' => $goods]);
    }

    /**
     * 显示编辑资源表单页.
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function edit($id)
    {
        //查询商品原始数据
        $info = \app\admin\model\Goods::find($id);
        //商品新增 	Goods控制器create方法  goods_add.html  -> create.html
        return view('edit', ['info' => $info]);
    }

    /**
     * 保存更新的资源
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {
        //接收数据
        $data = $request->param();
        //检查参数（表单验证）
        //定义规则数组
        $rule = [
          'goods_name' => 'require',
          'goods_price' => 'require|float|gt:0',
          'goods_number' => 'require|integer|gt:0',
        ];
        //定义错误提示信息数组
        $msg = [
            'goods_name.require' => '商品名称不能为空',
            'goods_price.require' => '商品价格不能为空',
            'goods_price.float' => '商品格式不正确',
            'goods_price.gt' => '商品价格必须大于0',
            'goods_number.require' => '商品数量不能为空',
            'goods_number.integer' => '商品格式不正确',
            'goods_number.gt' => '商品数量不得小于0'
        ];
        //实例化验证类
        $validate = new \think\Validate($rule, $msg);
        if(!$validate -> check($data)) {
            //验证失败
            $error = $validate->getError();
            $this->error($error);
        }
        //商品图片logo的修改
        $file = request()->file('logo');
        if(empty($file)) {
            unset($data['logo_logo']);
        } else {
            $data['goods_logo'] = $this->upload_logo();
            //先查询原图片地址
            $goods = \app\admin\model\Goods::find($id);
        }
        //修改数据到数据表
        GoodsModel::update($data, ['id' => $id], true);
        // GoodsModel::update($data, [], true);
        //修改logo后，删除原图片，可以节省磁盘
        if(isset($goods)) {
            unlink('.' . $goods['goods_logo']);
        }
        //页面跳转->跳转到列表
        $this->success('操作成功', 'index');
        //十九-修改操作
        //1.修改一条数据
        /*
        //先查询再更新
        $goods = \app\admin\model\Goods::find(33);
        $goods ->goods_name = 'thinkphp';
        $goods ->goods_price = '100';
        $goods ->allowField(true)->save();
        //直接更新
        $goods = new \app\admin\model\Goods();
        $data = ['goods_name' => 'thinkphp5.0', 'goods_price' => '10000'];
        //使用allowField方法 过滤非数据表字段
        $goods ->allowField(true)->save($data, ['id' => 33]);
        */
        //2.批量更新数据
        /*
        $goods = new \app\admin\model\Goods();
        // $list = [
        //     ['id'=>36, 'goods_name'=>'thinkphp', 'goods_number'=>'1001'],
        //     ['id'=>37, 'goods_name'=>'thinkphp2', 'goods_number'=>'1002'],
        // ];
        // $goods->saveAll($list);
        //通过遍历批量更新数据
        $goods = new \app\admin\model\Goods();
        $list = [
            ['id'=>36, 'goods_name'=>'thinkphp11', 'goods_price'=>100, 'goods_number'=>100],
            ['id'=>37, 'goods_name'=>'thinkphp12', 'goods_price'=>200, 'goods_number'=>200],
        ];
        foreach($list as $data) {
            $goods->data($data, true)->isUpdate(true)->save();
        }
        */
        //3.静态方法更新【建议使用】
        /*
        \app\admin\model\Goods::where('id', 38)
            ->update(['goods_name'=>'thinkphp_static_function']);
        \app\admin\model\Goods::update(['id'=>38, 'goods_name'=>'thinkphp_static_function22']);
        */
        //4.自动识别
        //模型的新增和更新都是用save方法，在框架下有一套默认的规则来识别当前数据是要执行更新还是新增
        //*实例化模型后           调用save方法表示新增
        //*查询数据后             调用save方法表示更新
        //*调用模型的save方法后    表示更新
        //-显示更新数据
        //实例化模型
        // $goods = new GoodsModel();
        //显示指定更新数据操作
        // $goods -> isUpdate(true)
        //     ->save(['id' => 1], ['goods_name' => 'thinkphp_instance']); echo "显示指定更新数据操作  成功";
        //-显示新增数据
        /*
        $goods = GoodsModel::get(2);
        $goods->goods_name = 'thinkphp_update';
        $goods->goods_price = '100';
        $goods->goods_number = '200';
        //显式指定当前操作为新增操作
        $goods->isUpdate(false)->save();  echo "显式指定当前操作为新增操作  成功";
        */

    }

    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id)
    {
        //id参数检测  正整数  （int)$a
        /*
        if(!(intval($id) == $id && $id >0)) {
            if(intval($id) != $id || $id <= 0) {
                $this->error('参数错误！');
            }
        }
        */
        // if(!preg_match('/^\d+$/', $id) || $id == 0) { $this->error("参数错误！"); }  //利用正则表达式简写

        //先查询再删除
        /*
        $goods = \app\admin\model\Goods::find($id);
        if($goods) {
            $res = $goods->delete();
            echo "查到 id = $id 的数据，删除成功！"; die;
        } else {
            echo "未查到 id = $id 的数据，删除失败"; die;
        }
        */
        //直接删除 使用where方法指定删除条件
        /*
        $res = \app\admin\model\Goods::where('id', '=', $id)->delete();
        if($res) {
            echo "删除成功！"; die;
        } else {
            echo "删除失败！"; die;
        }
        */
        //使用destroy方法
        /*
        \app\admin\model\Goods::destroy($id);
        //页面跳转
        $this->success('删除成功', 'index');
        */
        $res = \app\admin\model\Goods::destroy($id);
        if($res) {
            $this->success("删除成功"); //返回原页面
        } else {
            $this->error("删错失败");   //返回原页面
        }
    }
}
